package com.pethospital.service;

import com.pethospital.entity.HealthRecord;
import com.pethospital.entity.PageResult;

import java.sql.Date;
import java.util.List;

/**
 * 健康记录服务接口
 * Health Record Service Interface
 * 
 * @author PetHospital System
 * @version 1.0
 */
public interface HealthRecordService {
    
    /**
     * 根据记录ID获取健康记录
     * 
     * @param recordId 记录ID
     * @return HealthRecord 健康记录对象，如果不存在返回null
     */
    HealthRecord getHealthRecordById(Integer recordId);
    
    /**
     * 根据宠物ID获取健康记录列表
     * 
     * @param petId 宠物ID
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> getHealthRecordsByPetId(Integer petId);
    
    /**
     * 根据主人ID获取健康记录列表
     * 
     * @param ownerId 主人ID
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> getHealthRecordsByOwnerId(Integer ownerId);
    
    /**
     * 添加健康记录
     * 
     * @param healthRecord 健康记录对象
     * @return boolean 是否添加成功
     */
    boolean addHealthRecord(HealthRecord healthRecord);
    
    /**
     * 更新健康记录
     * 
     * @param healthRecord 健康记录对象
     * @return boolean 是否更新成功
     */
    boolean updateHealthRecord(HealthRecord healthRecord);
    
    /**
     * 删除健康记录
     * 
     * @param recordId 记录ID
     * @return boolean 是否删除成功
     */
    boolean deleteHealthRecord(Integer recordId);
    
    /**
     * 批量删除健康记录
     * 
     * @param recordIds 记录ID数组
     * @return boolean 是否删除成功
     */
    boolean batchDeleteHealthRecords(Integer[] recordIds);
    
    /**
     * 获取所有健康记录
     * 
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> getAllHealthRecords();
    
    /**
     * 分页获取健康记录
     * 
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> getHealthRecordsByPage(int currentPage, int pageSize);
    
    /**
     * 根据宠物ID分页获取健康记录
     * 
     * @param petId 宠物ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> getHealthRecordsByPetIdAndPage(Integer petId, int currentPage, int pageSize);
    
    /**
     * 根据主人ID分页获取健康记录
     * 
     * @param ownerId 主人ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> getHealthRecordsByOwnerIdAndPage(Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 根据条件分页查询健康记录
     * 
     * @param petName 宠物姓名（模糊查询）
     * @param diagnosis 诊断结果（模糊查询）
     * @param doctorName 医生姓名
     * @param visitDateStart 就诊开始日期
     * @param visitDateEnd 就诊结束日期
     * @param ownerId 主人ID（可选，为null时查询所有）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> searchHealthRecords(String petName, String diagnosis, String doctorName,
                                               Date visitDateStart, Date visitDateEnd, Integer ownerId,
                                               int currentPage, int pageSize);
    
    /**
     * 统计健康记录总数
     * 
     * @return long 健康记录总数
     */
    long getTotalHealthRecordsCount();
    
    /**
     * 根据宠物ID统计健康记录数量
     * 
     * @param petId 宠物ID
     * @return long 健康记录数量
     */
    long getHealthRecordsCountByPetId(Integer petId);
    
    /**
     * 根据主人ID统计健康记录数量
     * 
     * @param ownerId 主人ID
     * @return long 健康记录数量
     */
    long getHealthRecordsCountByOwnerId(Integer ownerId);
    
    /**
     * 获取需要复诊的记录
     * 
     * @return List<HealthRecord> 需要复诊的记录列表
     */
    List<HealthRecord> getRecordsNeedingFollowUp();
    
    /**
     * 获取最近的健康记录
     * 
     * @param petId 宠物ID
     * @param limit 限制数量
     * @return List<HealthRecord> 最近的健康记录列表
     */
    List<HealthRecord> getRecentHealthRecords(Integer petId, int limit);
    
    /**
     * 根据宠物ID获取最新的健康记录
     * 
     * @param petId 宠物ID
     * @return HealthRecord 最新的健康记录，如果不存在返回null
     */
    HealthRecord getLatestHealthRecordByPetId(Integer petId);
    
    /**
     * 获取今日新增的健康记录
     * 
     * @return List<HealthRecord> 今日新增的健康记录列表
     */
    List<HealthRecord> getTodayHealthRecords();
    
    /**
     * 根据费用范围查询记录
     * 
     * @param minCost 最小费用
     * @param maxCost 最大费用
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> getHealthRecordsByCostRange(Double minCost, Double maxCost);
    
    /**
     * 获取医生统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[医生姓名, 记录数量]
     */
    List<Object[]> getDoctorStatistics();
    
    /**
     * 获取月度统计信息
     * 
     * @param year 年份
     * @return List<Object[]> 统计结果，每个数组包含[月份, 记录数量]
     */
    List<Object[]> getMonthlyStatistics(int year);
    
    /**
     * 检查用户是否有权限访问指定的健康记录
     * 
     * @param recordId 记录ID
     * @param userId 用户ID
     * @param isAdmin 是否为管理员
     * @return boolean 是否有权限
     */
    boolean hasPermission(Integer recordId, Integer userId, boolean isAdmin);
    
    /**
     * 验证健康记录数据
     * 
     * @param healthRecord 健康记录对象
     * @param isUpdate 是否为更新操作
     * @return String 验证结果，null表示验证通过，否则返回错误信息
     */
    String validateHealthRecord(HealthRecord healthRecord, boolean isUpdate);
}
